154 IF TOTDOTS = 0 THEN GOSUB 1000: GOTO 70 'REPLACE DOTS AND CONTINUE. **CHK 2000
155 IF LIVES > 0 THEN GOTO 80
160 GOSUB 4750 'ALL LIVES GONE, WIND IT UP.
170 IF AG=1 THEN GOTO 60 `IF PLAYING AGAIN, START OVER.
199 END
1000 REM ROUTINE TO REPLACE DOTS TO CONTINUE PLAY.
1010 PUT (XPAC,YPAC),PACMAN%,XOR 'REMOVE PACMAN FROM BOARD.
1020 PUT (XGH1,YGH1),GHOST%,XOR 'REMOVE GHOST.
1030 GOSUB 10500 'REPLACE THE DOTS.
1040 RETURN
2000 REM REPLACE DOTS TO ALLOW PLAYER TO CONTINUE PLAY.
2010 PUT (0,0),BOARD%,PSET 'RESTORE BOARD AND DOTS.
2020 PLAY"O2CFAO3CO2AO3C"
2030 RETURN
4000 REM INITIALIZATION ROUTINE.
4050 DIM XY(30,33) 'ARRAY TO MARK JUNCTIONS, 1 IF A JUNCTION, 0 IF NOT.
4100 DIM BOARD%(20) 'ARRAY TO SAVE BOARD AFTER ITS DRAWN. NEEDS 9300 BYTES.
4150 REM
4200 SCREEN 0,1: WIDTH 40: COLOR 13,0: LOCATE 2,17: PRINT "PACMAN" : COLOR 14,0
4250 LOCATE 5,5: PRINT"HIT SPACE BAR FOR DEFAULT CONTROL KEYS (IE. LEFT:a RIGHT:l UP:y DOWN:b ) "
4300 LOCATE 9,5: PRINT" OR ANY OTHER KEY TO SELECT YOUR OWN CONTROLS."
4350 A$ = INKEY$: IF LEN(A$) = 0 THEN 4350
4400 IF A$ = " " THEN LT$="a": RT$="l":UP$="y": DN$="b": GOTO 4700
4450 PRINT "Enter character to move pacman - left:"
4452 LT$=INKEY$: IF LEN(LT$)=0 THEN 4452
4460 LT$=CHR$(ASC(LT$) OR 32) 'MAKE LOWER CASE.
4500 PRINT "Enter character to move pacman - right:"
4510 RT$=INKEY$: IF LEN(RT$)=0 THEN 4510
4520 RT$=CHR$(ASC(RT$) OR 32) 'MAKE LOWER CASE.
4550 PRINT "Enter character to move pacman - up:"
4560 UP$=INKEY$: IF LEN(UP$)=0 THEN 4560
4570 UP$=CHR$(ASC(UP$) OR 32) 'MAKE LOWER CASE.
4600 PRINT "Enter character to move pacman - down:"
4650 DN$=INKEY$: IF LEN(DN$)=0 THEN 4650
4660 DN$=CHR$(ASC(DN$) OR 32) 'MAKE LOWER CASE.
4700 RETURN
4750 REM ALL PACMAN LIVES ARE USED UP. WIND UP THE GAME.
4800 LOCATE 22,25: PRINT "GAME OVER"
4850 LOCATE 24,25: INPUT ; "PLAY AGAIN"; ANS$
4900 IF ANS$ = "Y" OR ANS$ = "YES" OR ANS$="y" OR ANS$="yes" THEN AG=1 ELSE AG=0
4950 RETURN
5000 REM CHECK FOR GHOST COLLISION WITH PACMAN AND HANDLE IT.
5050 IF (XPAC <> XGH1) OR (YPAC <> YGH1) THEN RETURN
5100 REM A COLLISION HAS OCCURRED.
5150 PLAY "MFT200O2BGFDD-C"
5200 PUT (XGH1,YGH1),GHOST%,XOR 'REMOVE GHOST FROM COLLISION SPOT.
5250 PUT (XPAC,YPAC),PACMAN%,XOR 'REMOVE PACMAN FROM COLLISION SPOT.
5300 LIVES = LIVES - 1
5350 XPAC=95: YPAC=143 'START NEW PACMAN IN INIT POSITION.
5400 PUT (XPAC,YPAC),PACMAN%,XOR
5450 LINE (200+LIVES*20,70)-(210+LIVES*20,80),0,BF 'REMOVE LIFE ON SCOREBOARD.
5500 XGH1 = 95: YGH1 = 71 'RESET GHOST LOCATION.
5550 PUT (XGH1,YGH1),GHOST%,XOR
5600 IF LIVES > 0 THEN FOR W = 1 TO 1500: NEXT W 'GIVE PLAYER A LITTLE TIME.
5650 BEEP
5700 RETURN
5750 REM MOVE GHOSTS AROUND THE BOARD.
5800 REM
5850 REM DIRECTIONS: 1 LEFT 2 DOWN 3 RIGHT 4 UP
5900 PUT (XGH1,YGH1),GHOST%,XOR 'REMOVE GHOST.
5950 C = 0 'TEMP FOR TESTING.
6000 NXGH1 = XGH1: NYGH1 = YGH1 'SET DEFAULTS.
6050 ODIR = GH1DIR 'TEMP SAVE OLD DIR.
6100 REM SEE IF AT A JUNCTION AND IF SO PICK A NEW DIRECTION.
6150 XMOD = (NXGH1 + 1) MOD 6 : YMOD = (NYGH1 + 7) MOD 6 'SEE IF AT A JUNCTN.
6200 IF (XMOD <> 0) OR (YMOD <> 0) THEN GOTO 6600 'IF NOT, PROCEED IN OLD DIR.
6250 IF XY((NXGH1+1)/6,(NYGH1+7)/6) <> 1 THEN GOTO 6600 'IF NOT, KEEP MOVING.
6300 REM GHOST IS AT A JUNCTION SO DECIDE ON DIRECTION.
6350 IF (ABS(XPAC-NXGH1) > ABS(YPAC-NYGH1)) AND (RND < 0.8) THEN IF XPAC>NXGH1 THEN GH1DIR=3 ELSE GH1DIR=1 ELSE IF YPAC>NYGH1 THEN GH1DIR=2 ELSE GH1DIR=4 'GO TOWARD PACMAN.
6400 REM LOCATE 15,25: PRINT "RD" GH1DIR
6450 REM
6500 C = C + 1: IF C > 20 THEN PRINT "C > 20": STOP
6550 NXGH1 = XGH1: NYGH1 = YGH1 'RESET DEFAULTS.
6600 IF GH1DIR = 1 THEN NXGH1 = XGH1-PMINCR: XA=3: YA=2: XB=3: YB=8
6650 IF GH1DIR = 2 THEN NYGH1 = YGH1+PMINCR: XA=2: YA=7: XB=8: YB=7
6700 IF GH1DIR = 3 THEN NXGH1 = XGH1+PMINCR: XA=7: YA=2: XB=7: YB=8
6750 IF GH1DIR = 4 THEN NYGH1 = YGH1-PMINCR: XA=2: YA=3: XB=8: YB=3
6800 IF NXGH1 < 11 THEN NXGH1 = 173
6850 IF NXGH1 > 173 THEN NXGH1 = 11
6900 IF NYGH1 < 11 THEN NYGH1 = 11
6950 IF NYGH1 > 179 THEN NYGH1 = 179
7000 REM SEE IF WAY IS CLEAR IN INTENDED DIRECTION.
7050 IF POINT(NXGH1+XA,NYGH1+YA) = 2 OR POINT(NXGH1+XB,NYGH1+YB) = 2 THEN GH1DIR = INT(RND*4) + 1: GOTO 6500 'IF NOGO THEN CHNG DIR FOR NEXT TIME.
7100 XGH1 = NXGH1: YGH1 = NYGH1 'WAY OK, SO SET UP NEW LOCATION.
10800 IF IX>79 AND IX<115 AND IY>85 AND IY<103 THEN GOTO 10950 'skip middle box.
10850 IF IC=0 THEN PSET(IX,IY),DOTCOLOR : TOTDOTS=TOTDOTS+1
10900 IF (IC=0) AND (POINT(IX-6,IY)<>2 OR POINT(IX+6,IY)<>2) AND (POINT(IX,IY-6)<>2 OR POINT(IX,IY+6)<>2) THEN XY(XDOT,YDOT) = 1 ' MARK JUNCTIONS.
10950 NEXT IX: NEXT IY
11000 PACDIR = 0 'set not moving
11050 REM NOW GET ENTIRE BOARD AND SAVE IT.
11100 GET (0,0)-(0,1),BOARD% 'S/B 184,196
11120 REM
11130 LOCATE 15,25: PRINT "READY "
11135 FOR W = 1 TO 800: NEXT W: LOCATE 15,25: PRINT " "
11150 RETURN
11200 REM
11250 REM DRAW THE PLAYING BOARD.
11300 REM NOTE: DO NOT CHANGE COLOR IN THE LINE COMMANDS USED TO DRAW THE BOARD UNLESS THE BOARD DETECTION STATEMENTS (IE. POINT STMTS) IN THE MOVE ROUTINE ARE ALSO ADJUSTED TO THE SAME COLOR.